sizeof 和strlen的区别
举例2015-11-11 上午11.05.13.png
1.首先,sizeof()是用来计算字符串或其他对象所占内存的字节数;char a[40];在创建字符数组a的时候就给a分配了40*sizeof(char)的字节内存;
2.strlen(),就是计算当前字符串的长度并返回包括\0;
do while 和while do 的区别
while语句是先测试条件再执行语句,条件不符后终止
do while语句是先执行语句再测试条件,条件不符后终止,所以do while循环至少执行一次
property中属性retain,copy,assign的含义分别是什么?有什么区别?有什么主意事项?
@property是属性的属性设置分三类
retain,copy,assign属于其中语义设置类
1.assign:使用 assign声明属性对应的实例变量存取器方法的实现,是在方法里直接赋值、取值‘并没有操作内存里的引用计数。一般用来将基本数据的属性特征声明为assign
- reatain:使用 reatain声明的属性对应的实例变量存取器方法的实现,内部会坐内存优化处理:修改对象的引用计数
- copy:使用copy 实名的属性对应的实例变量存取器方法的实现,内部会坐内存优化处理:将对象拷贝一份,然后修改新对象的引用计数(区分深拷贝和浅拷贝)
一般情况下,将OC中的对象声明为retain或者copy特性
如果属性是 对象类型( 如int,float等)属性的语义设置使用assign。
如果属性是对象类型( 如NSStrng、NSArray等)属性的语义设
置使用 retain。
如果属性是对象类型并且想得到参数的copy,使用 copy关键字。
# import和# include有什么区别,@class呢?#improt<>和#improt" "呢?
http://blog.csdn.net/jiangwei0910410003/article/details/41774747
一.import和# include的区别
当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误。
但是使用两次#import的话,不会报错,所以他可以解决重复导入的问题,他会做一次判断,如果已经导入一次就不导入了。
二、关键字@class的作用
在来看一下OC中的关键字@class的作用,在看他的作用之前,先来看一个问题:
现在有一个课程类Classes和学生类Student,他们两之间需要相互引用(导入)。直接看代码比较直接:
Classes.h
[objc] view plaincopy
//
// Classes.h
// 08_@class
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Student.h"
//不会将Student.h拷贝过来,只是告诉编译器Student这个类在别的地方中有定义,这样就不知道这个类中任何信息(哪些属性和方法)
//@class Student;
@interface Classes : NSObject{
@public
Student *_student;
}
- (void)t1;
@end
导入Student.h头文件
Classes.m
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
//
// Classes.m
// 08_@class
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import "Classes.h"
//#import "Student.h"
@implementation Classes
- (void)t1{
[_student work];
}
@end
在来看一下Student类
Student.h
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
// Student.h
// 08_@class
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import <Foundation/Foundation.h>
import "Classes.h"
@interface Student : NSObject{
Classes *_classes;
}
- (void)work;
@end
同样的也导入Classes.h头文件
Student.m
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
//
// Student.m
// 08_@class
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
#import "Student.h"
@implementation Student
- (void)work{
NSLog(@"work");
}
@end
在来看一下测试代码:
main.m
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
//
// main.m
// 08_@class
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
//
import <Foundation/Foundation.h>
import "Classes.h"
import "Student.h"
//Classes和Student相互导入会出现问题
//这时候我们就可以使用@class解决这样的问题
//我们一般在.h文件中使用@class,因为在.h文件中一般是不会使用类的属性和方法的
//在.m文件中可以导入.h文件
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
Classes *cls =[[Classes alloc] init];
Student *stu = [[Student alloc] init];
cls->_student = stu;
[cls t1];
}
return 0;
}
这里有一个问题注意一下:我们看到了这里是如何使用Classes中的属性_student的,因为在Classes类中属性_student是@public的,所以可以直接使用,用的是箭头符号,和C/C++中的指针变量调用差不多。记住了,这里就说到了如何直接访问一个类中的@public修饰符的属性变量
网友评论