属性,使用点表示法;
@property默认会自动生成一个_开头的私有成员变量。(在.m文件中生成)以及@gettter和@setter方法的声明和实现。如果需要对传入的数据进行过滤,必须重写@getter/@setter方法,@property则不会自动生成一个 _开头的私有成员变量。@property只能写在类的声明(@interface)中。
数组NSArray
1.不可变数组
NSArray *array = [NSArray arrayWithObjects:@"iphone", @"123",nil];//nil不可少,代表结束的标志 //获取元素个数 [array count]; NSLog(@"count = %ld", [array count]); //根据index值获取对象 NSLog(@"%@", [array objectAtIndex:0]); 或者直接引用 NSLog(@"%@", array[1]);
NSMutableArray *mArr = [NSMutableArray arrayWithObjects:@"zhao",@"peng",@"pengpeng", nil]; //添加元素 [mArr addObject:@"hahah"]; for(int i = 0;i < [mArr count]; i ++){ NSLog(@"%@",mArr[i]); } //删除元素 [mArr removeLaseObject]; NSLog(@"%@", mArr); // 删除了最后一个; //替换 [mArr replaceObjectAtIndex:0 withObject:@"BSD"]; // 指定位置替换掉 //交换指定位置的元素 [mArr exchangeObjectAtIndex:0 withObjectAtIndex:1]; //数值与对象转换 //因为数组和字典中存放的只能是对象类型. 所以一般的数值是不能直接存入的, 只能转化成对象元素才能存入! //如: int c = 100; float f = 1.2; NSNumber *c1 = [NSNumber numberWithDouble:c]; NSNumber *f1 = [NSNumber numbserWithDouble:f]; //这是把数值转化为了NSNumber格式存入到了字典, 当然你也可以数值转化为字符串格式存入! NSMubleArray *mArr2 = [NSMutableArray arrayWithObjects:c, f, nil];
- (BOOL)isEqual:(id)object { if (object == self) { return YES; } // if (![object isKindOfClass:[NewsEntity class]]) { return NO; } / NewsEntity *entity = (NewsEntity *)object; if ([entity.title isEqualToString:self.title]) { return YES; } else { return NO; } }
Category An opaque type that represents a category.
typedef struct objc_category *Category;
struct objc_category{ char *category_name OBJC2_UNAVAILABL char *class_nameO OBJC2_UNAVAILABL struct objc_method_list *instnace_methods OBJC2_UNAVAILABLE struct objc_method_list *class_methods OBJC2_UNAVAILABLE struct objc_protocol_list *protocols OBJC2_UNAVAILABLE } OBJC2_UNAVAILAB
//协议的定义: @protocol 协议名称<NSObject>//默认遵守NSObect名称 //方法声明 @end //协议的采纳 //创建类的时候遵守某个或多个协议 @interface 类名: 父类<协议名称1,协议名称2> @end //某个协议也可以遵守其他协议 @proptocal 协议名称<协议名称1.协议名称2> //方法声明 @end //proptocal中的@require和@optionl的使用: //@required:表示这个方法必须要实现(默认) //@optional:表示这个方法不是必须要实现的 //protocal类型限制: //增加<hoiseHold>以后,表示obj只能赋值遵守了houseHold协议的对象 id<houseHold> obj = mm; //表示obj2赋值的时候,必须是Girl对象,并其遵守了houseHold的协议 Girl<houseHold> *obj2 = mm; //让定义的成员属性(对象)遵守某个协议 @property (nonatomic,strong) Dog<协议名称> * dog;
int (^sumBlock)(int, int);
typedef int(^BLOCk) (int, int); int main(int argc, const char * argv[]) { @autoreleasepool { BLOCk sumBlock2; sumBlock2 = ^(int num1, int num2) { NSLog(@"我是sumBlock2"); return num1 + num2; }; sumBlock2(2, 3); } return 0; }
通过下面三种方法可以获取SEL: a sel_registerName函数 b Objective-C编译器提供的@selector()方法 c NSSelectorFromString()方法
id (* IMP)(id, SEL,...)
objc_msgSend(receiver, selector)
objc_msgSend(receiver, selector, arg1, arg2, ...)
id arr = [[NSArray alloc] init]; //等同于 id __strong arr = [[NSArray alloc] init];
{ //自己生成的对象自己持有 id __strong arr = [[NSArray alloc] in